#ifndef DATABLOCK_MANAGER_H
#define DATABLOCK_MANAGER_H

#include <QWidget>
#include <QString>
#include <QPixmap>
#include <QHash>
#include <QObject>
#include <QLabel>
#include <QFile>
#include <QStyle>
#include <QMutex>
#include <QPointer>
#include <QVBoxLayout>
#include "datablock_info.h"
namespace Ui
{
    class datablock_manager;
}

class datablock_manager : public QWidget
{
    Q_OBJECT

public:
    explicit datablock_manager(QWidget *parent = nullptr);
    ~datablock_manager();
    int createBlock(const DataBlock &data);
    bool deleteBlock(int handleId);
    bool updateBlockData(int handleId, const DataBlock &newData);

    // 新增设置温度和湿度阈值的接口
    void setTemperatureThreshold(double threshold);
    void setHumidityThreshold(double threshold);
    void setUltrasonicThreshold(double threshold);
    void setTEVThreshold(double threshold);
    void setUltrasonicVisible(bool visible);
    void setTEVVisible(bool visible);
    void setUltrasonicData(QString data);
    void setTEVData(QString data);
    void setItemsPerRow(int maxRow);
    void setBlockName(QString name);
    void setTempIn(QString temp);
    void setHumIn(QString hum);
    void setTempInVisible(bool visible);
    void setHumInVisible(bool visible);
    void updateLayout(); // 因为该控件是最后布局的,所以布局前子控件不具备设定的宽高,需要在给定父类后才能update
signals:
    void blockCreated(int handleId);
    void blockRemoved(int handleId); // 表示handleId代表的控件已经移除
signals:
    void signalToForward(const QString &msg);
private slots:
    void on_pushButton_info_clicked();

    void on_pushButton_info_released();

private:
    Ui::datablock_manager *ui;
    mutable QMutex m_mutex;
    QGridLayout *m_gridLayout = nullptr; // 布局
    int m_itemsPerRow = 6;               // 一行的块个数
    // 双向映射表,QPointer智能指针会在类析构后自动变为null,而不是野指针
    QHash<int, QPointer<datablock_info>> m_handleMap; // 句柄ID -> 实例
    QList<int> m_insertionOrder;                      // 保持插入顺序的列表
    QMap<int, int> m_dataIdMap;                       // 数据ID(传入的id) -> 句柄ID 用来保证一个数据id对应一个句柄,并且自动根据id排序
    double m_temperatureThreshold = 85.0;             // 默认温度阈值
    double m_humidityThreshold = 65.0;                // 默认湿度阈值
    double m_ultrasonicThreshold = 80.0;              // 超声波默认阈值
    double m_tevThreshold = 80.0;                     // 暂态地电压默认阈值
    int generateHandleId() const
    {
        static std::atomic<quint32> counter{0};
        return static_cast<int>(++counter);
    }
    void initUi();
    // 新增样式设置方法
    void updateFrameStyle(QFrame *frame, const QString &status);
};

#endif // DATABLOCK_MANAGER_H